package commons.params_appli;

import commons.utils.Utils;
import commons.logs.Logger;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;



public class INIFileReader {

	// On n'utilise pas le logeur à ce stade, car on ne sait pas quel niveau a souhaité l'utilisateur
	// Cette classe ne logant qu'en DEBUG1, on stocke les log dans une String
	//  qui pourra etre affichée à la fin si besoin
	String logDebug1 = "";

	private HashMap<String,HashMap<String,String>> mapSections;


	public INIFileReader() {
		mapSections=new HashMap<String,HashMap<String,String>>(30);
	}

	public void load(InputStream fichierINI) throws Exception {
		logDebug1 += "Lecture du fichier INI : debut";

		BufferedReader reader=new BufferedReader(new InputStreamReader(fichierINI, "UTF-8"));
		String line=null;
		String currentSectionName=null;

		while ((line=reader.readLine())!=null) {
			line=line.trim();
			if (line.isEmpty()) continue;
			
			if (((int)line.charAt(0)) == 65279) // cas d'un caractere BOM en debut de fichier en UTF8
				line = line.substring(1);
			
			if (line.length()==0)
				continue; // ligne vide
			
			if (line.startsWith(";"))
				continue; // commentaire

			if (line.startsWith("[")) {
				if (!line.endsWith("]"))
					throw new Exception("La ligne suivante ne représente pas une section valide (manque \']\') :\n -> " + line);
				
				currentSectionName=line.substring(1, line.length()-1).trim();
				addSection(currentSectionName);
			} else {
				// On est sur une ligne normale
				// Si pas encore de section créée, on rajoute une section vide
				if (currentSectionName==null) {
					currentSectionName="";
					addSection(currentSectionName);
				}

				addLineToSection(line, currentSectionName);
			}
		}

		reader.close();

		logDebug1 += "Lecture du fichier INI : fin";
	}


	// Renvoie null si pas trouve, "" si empty
	public String getParam(String sectionName, String key) {
		HashMap<String,String> section=getSection(sectionName.toUpperCase());
		if (section==null)
			return null;

		return section.get(key.toUpperCase());
	}

	private void addLineToSection(String line, String sectionName) throws Exception {
		assert(mapSections.containsKey(sectionName.toUpperCase()));
		HashMap<String,String> section= mapSections.get(sectionName.toUpperCase());

		String[] tab = Utils.mySplit(line, '=');
		if (tab.length != 2)
			throw new Exception ("La ligne suivante est invalide (il faut : <cle>=<valeur>) :\n -> " + line);

		String cle = tab[0].trim().toUpperCase();
		String val = tab[1].trim();

		if (cle.length()==0)
			throw new Exception ("La ligne suivante est invalide (il faut : <cle>=<valeur> avec <cle> non vide) :\n -> " + line);

		section.put(cle, val);
		logDebug1 += " - lecture prop : [" + sectionName + "] : " + cle + " = " + val + "\n";
	}

	private void addSection(String aSectionName) {
		HashMap<String,String> section=getSection(aSectionName.toUpperCase());
		if (null==section) {
			section=new HashMap<String,String>(30);
			mapSections.put(aSectionName.toUpperCase(), section);
		}
	}

	private HashMap<String,String> getSection(String aSectionName) {
		if (aSectionName==null)
			return  mapSections.get("");
		else
			return  mapSections.get(aSectionName.toUpperCase());
	}
}

